package yicr.untils.datetime;



import yicr.untils.NslUtilString;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Calendar;
import java.util.Date;
import java.util.List;

public class NslUtilDateTime {

    public static String pattern1="yyyy-MM-dd HH:mm:ss";

    private static String defaultDatePattern = "yyyy-MM-dd ";
    static  public String getTimeStamp(){
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH-mm-ss_SSS"); // 设置格式
        Long currentTime = System.currentTimeMillis();  // 获取当前时间戳
        String timeString = format.format(currentTime);  // 时间戳转为时间格式
        return timeString;
    }

    /**
     * formatted datetime stamp
     * @return
     */
    static public String getDateStringAsDd_Hh_Mm_SS(){
        SimpleDateFormat format=new SimpleDateFormat("dd_HH_mm_ss");
        String s=format.format(new Date());
        return s;
    }

    /**
     * 判断是否是有效日期格式
     * @param dateStr
     * @return
     */
    public static boolean isValidDate(String dateStr) {
        // 定义可接受的日期格式
        String[] validFormats = {"yyyy-MM-dd", "dd/MM/yyyy", "MM/dd/yyyy","M/d/yy"};
        for (String format : validFormats) {
            try {
                DateFormat dateFormat = new SimpleDateFormat(format);
                dateFormat.setLenient(false); // 设置为严格模式
                dateFormat.parse(dateStr); // 尝试解析日期
                return true; // 如果没有异常抛出，则认为是有效日期
            } catch (ParseException e) {
                // 异常捕获，继续尝试下一个格式
            }
        }
        return false; // 如果所有格式都尝试过后仍无法解析，则返回false
    }

    /**
     *
     * @param date
     * @return
     */
    public static String formatDateAs20201230(Date date){
        DateFormat dateFormat = new SimpleDateFormat(defaultDatePattern);
        return dateFormat.format(date);
    }

    /**
     * 以 yyyy-MM-dd HH:mm:ss 输出 localDateTime
     * @param localDateTime
     * @return
     */
    public static String formatLocalDateTime(LocalDateTime localDateTime){
        String format="yyyy-MM-dd HH:mm:ss";
        if(localDateTime==null){
            return "空值";
        }

        return localDateTime.format((DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
    }

    /**
     * 以 dateTimeFormatter 输出 localDateTime
     * @param localDateTime
     * @return
     */
    public static String formatLocalDateTime(LocalDateTime localDateTime,String dateTimeFormatter){
        if(localDateTime==null){
            return "空值";
        }
        return localDateTime.format((DateTimeFormatter.ofPattern(dateTimeFormatter)));
    }

    /**
     * 将一种字符串类型的日期格式，转化成另一种 字符串格式
     * @param dateString
     * @param srcFormatString
     * @param targetFormatString
     * @return
     * @throws ParseException
     */
    public static String convertDateString(String dateString,String srcFormatString,String targetFormatString) throws ParseException {
        DateFormat dateFormat = new SimpleDateFormat(srcFormatString);
        Date date=dateFormat.parse(dateString);
        DateFormat targetDateFormat=new SimpleDateFormat(targetFormatString);
        return targetDateFormat.format(date);
    }


    public static LocalDateTime getLatestDataTime(List<LocalDateTime> dateTimeList){
       LocalDateTime latest=null;
       if(dateTimeList==null || dateTimeList.size()==0){
           throw  new RuntimeException("传入的dateTimeList 为空");
       }
       latest=dateTimeList.get(0);
        for (LocalDateTime localDateTime : dateTimeList) {
            if(localDateTime.isAfter(latest)){
                latest=localDateTime;
            }
        }
        return latest;
    }

    /**
     * 在日期上增加数个整月
     */
    public static Date addMonth(Date date, int n)
    {
        Calendar cal = Calendar.getInstance();
        cal.setTime(date);
        cal.add(Calendar.MONTH, n);
        return cal.getTime();
    }

    public static String getLastDayOfMonth(String year, String month)
    {
        Calendar cal = Calendar.getInstance();
        // 年
        cal.set(Calendar.YEAR, Integer.parseInt(year));
        // 月，因为Calendar里的月是从0开始，所以要-1
        // cal.set(Calendar.MONTH, Integer.parseInt(month) - 1);
        // 日，设为一号
        cal.set(Calendar.DATE, 1);
        // 月份加一，得到下个月的一号
        cal.add(Calendar.MONTH, 1);
        // 下一个月减一为本月最后一天
        cal.add(Calendar.DATE, -1);
        return String.valueOf(cal.get(Calendar.DAY_OF_MONTH));// 获得月末是几号
    }

    /**
     * 使用预设格式将字符串转为Date
     */
    public static Date parse(String strDate) throws ParseException
    {
        return NslUtilString.isNullOrEmpty(strDate) ? null : parse(strDate,
                defaultDatePattern);
    }

    /**
     * 使用参数Format将字符串转为Date
     */
    public static Date parse(String strDate, String pattern)
            throws ParseException
    {
        return NslUtilString.isNullOrEmpty(strDate) ? null : new SimpleDateFormat(
                pattern).parse(strDate);
    }

    public static Date getDate(String year, String month, String day)
            throws ParseException
    {
        String result = year + "- "
                + (month.length() == 1 ? ("0 " + month) : month) + "- "
                + (day.length() == 1 ? ("0 " + day) : day);
        return parse(result);
    }


    public static void main(String[] args) {
        String[] testDates = {"2023-03-01", "01/03/2023", "2023/03/01", "not-a-date"};
        for (String date : testDates) {
            System.out.println(date + " is a valid date: " + isValidDate(date));
        }
    }

}
